﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace A58泛型集合
{
    class Program
    {
        //List<T>  列表 类似于数组可以看成是变长的数组-------------------------------------------------------
        static void Main1(string[] args)
        {

            //创建一个存int的List对象
            List<int> ls = new List<int>();
            //ls[0] = 9;  报错
            //添加元素
            ls.Add(1);//第0个
            ls.Add(2);//第1个
            //访问元素,必须先添加再访问
            Console.WriteLine(ls[0]);//1
            Console.WriteLine(ls[1]);//2
            ls[0] = 3;
            Console.WriteLine(ls[0]);//3
            //查看元素个数
            Console.WriteLine(ls.Count);//2
            //查看容量大小(内部数组大小)
            Console.WriteLine(ls.Capacity);

            //for循环遍历
            for (int i = 0; i < ls.Count; i++)
            {
                Console.WriteLine(ls[i]);
            }
            //foreach 遍历
            foreach (var item in ls) //注意:forech中任何时候都不能对item赋值
            {
                Console.WriteLine(item);
            }
        }
        //练习   用List存储4个最常用的访问修饰符的单词 并遍历输出
        static void Main2(string[] args)
        {
            List<string> ls = new List<string>();
            ls.Add("public");
            ls.Add("private");
            ls.Add("protected");
            ls.Add("internal");
            for (int i = 0; i < ls.Count; i++)
            {
                Console.WriteLine(ls[i]);
            }
        }
        //List常用API
        static void Main3(string[] args)
        {
            List<int> ls = new List<int>();
            ls.Add(2);
            ls.Add(3);
            ls.Add(4);
            ls.Add(2);
            // ls.Remove(2);//移除
            //ls.RemoveAt(1);
            //ls.Insert(1,7);
            // int[] arr = { 8, 9 };
            // ls.InsertRange(0,arr);
            //ls.Clear();
            // int index= ls.IndexOf(20);
            //Console.WriteLine(index);
            Console.WriteLine(ls.Contains(2));
            foreach (var item in ls)
            {
                Console.WriteLine(item);
            }


        }

        //Dictionary<T>  字典 以键值对形式存储数据,查找方便-------------------------------------------------------
        static void Main4(string[] args)
        {
            //创建字典对象
            Dictionary<string, string> dic = new Dictionary<string, string>();
            //添加元素,键不能重
            dic.Add("主机", "192.168.0.254");
            dic.Add("用户名", "a");
            dic.Add("密码", "123");
            dic.Add("端口", "22");
            //访问元素
            Console.WriteLine(dic["主机"]);//192.168.0.254
            dic["用户名"] = "b";//修改
            Console.WriteLine(dic["用户名"]);

            //遍历只能用foreach  
            foreach (var item in dic) //item是键值对类型
            {
                Console.WriteLine(item.Key + ":" + item.Value);
            }

            //只遍历字典的键
            foreach (var item in dic.Keys) //item就是键
            {
                Console.WriteLine(item + ":" + dic[item]);
            }


            //先判断是否存在这个键
            if (dic.ContainsKey("随便"))
            {
                Console.WriteLine(dic["随便"]); //注意访问不存在的键就会报错
            }
            //也可以用tryGetValue
            string v;
            if (dic.TryGetValue("随便", out v))
            {
                Console.WriteLine(v);
            }

            //用字典来表示一个Excel文件
            Dictionary<string, List<List<string>>> table = new Dictionary<string, List<List<string>>>();
        }
        //练习:用字典存储 四个访问修饰符英文名称做键, 解释作为值

        //Stack<T>  栈 先进后出-------------------------------------------------------
        static void Main5(string[] args)
        {
            Stack<int> stack = new Stack<int>();
            //添加数据  入栈
            stack.Push(1);
            stack.Push(2);
            stack.Push(3);
            //取数据  移除并返回栈顶部元素
            // Console.WriteLine(stack.Pop()); //3
            // Console.WriteLine(stack.Pop()); //2
            // Console.WriteLine(stack.Pop()); //1

            while (stack.Count > 0)
            {
                int n = stack.Pop();
                Console.WriteLine(n);
            }

            //  Console.WriteLine(stack.Peek()); //只返回不移除
        }
        //Queue<T> 先进先出 ------------------------------------------------------------------------------------------------------
        static void Main6(string[] args)
        {
            Queue<int> queue = new Queue<int>();
            queue.Enqueue(1);
            queue.Enqueue(2);
            queue.Enqueue(3);
            //出队
            while (queue.Count > 0)
            {
                Console.WriteLine(queue.Dequeue());
            }
        }

        //HashSet  过滤重复元素
        static void Main7(string[] args)
        {
            HashSet<string> names = new HashSet<string>();
            names.Add("张三");
            names.Add("李四");
            names.Add("张三");
            foreach (var item in names)
            {
                Console.WriteLine(item);
            }
        }
        //链表
        static void Main(string[] args)
        {
            LinkedList<int> lls = new LinkedList<int>();
            lls.AddLast(2);
            lls.AddLast(1);
           LinkedListNode<int> node6= lls.AddLast(6);

            lls.Remove(1);
            lls.AddBefore(node6,5);

            foreach (var item in lls)
            {
                Console.WriteLine(item);
            }
        }
    }
}
